package org.example.mq.mqserver.core;
/*
*
* 表示一个要传递的消息
*
* 注意！！！此处的Message对象，是需要能够在网络上传输，并且也需要能写入到文件中
* 此时就需要针对Message进行序列化和反序列化
* 此处使用标准库自带的序列化和反序列化操作
* */

import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;

public class Message implements Serializable {
    private static final long serialVersionUID = 1L;//验证版本

    //这两个属性是Message最核心的部分
    private BasicProperties basicProperties=new BasicProperties();//属性
    private byte[] body;//内容

    //下面的属性是辅助用的属性
    //Message后续会存储到文件中（如果持久化的话）
    //一个文件会存储很多的信息,如何找到某个消息，文件中的具体位置呢？
    //使用下列的两个偏移量来进行表示，[offsetBeg,offestEnd)
    //这俩属性不需要序列化保存到文件中~~此时消息一旦被写入文件中之后，所在的位置就固定了，并不需要单独存储
    //这俩属性存在的目的，主要就是为了让内存中的Message对象，能够快速找到对应硬盘上的Message的位置
    private transient long offsetBeg=0;//消息数据的开头距离文件开头的位置偏移（字节）
    private transient long offsetEnd=0;//消息数据的结尾距离文件开头的位置偏移（字节）
    //使用这个属性表示该消息在文件中是否是有效消息,逻辑删除（只是标记无效，不是真删除）
    //0x1表示有效，0x0表示无效
    private byte isValid=0x1;

    //创建一个工厂方法，让工厂帮我们封装一下创建Message对象的过程
    //这个方法中创建的Message对象，会自动生成唯一的MessageId
    //万一routingKey和basicProperties里的routingkey冲突以外面为主
    public static Message createMessageWithId(String routingKey,BasicProperties basicProperties,byte[] body) {
        Message message=new Message();
        if (basicProperties!=null){
            message.setBasicProperties(basicProperties);
        }
        //此处生成的MessageId以M-为前缀
        message.setMessageId("M-"+ UUID.randomUUID());
        message.setRoutingKey(routingKey);
        message.body=body;
        //此处是把body和basicProperties先设置出来，他俩是Message的核心内容
        //而offsetBeg，offsetEnd，isValid，则是消息持久化的时候才会用到，在把消息写入文件之前再进行研究设定
        //此处只是在内存中创建一个Message对象
        return message;
    }

    public String getMessageId() {
        return basicProperties.getMessageId();
    }
    public void setMessageId(String messageId) {
        basicProperties.setMessageId(messageId);
    }

    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }
    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }
    public int getDeliverMode(){
        return basicProperties.getDeliverMode();
    }
    public void setDeliverMode(int Mode){
        basicProperties.setDeliverMode(Mode);
    }

    public void getMessageType(String messageId) {
        basicProperties.setMessageId(messageId);
    }

    public BasicProperties getBasicProperties() {
        return basicProperties;
    }

    public void setBasicProperties(BasicProperties basicProperties) {
        this.basicProperties = basicProperties;
    }

    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }

    public long getOffsetBeg() {
        return offsetBeg;
    }

    public void setOffsetBeg(long offestBeg) {
        this.offsetBeg = offestBeg;
    }

    public long getOffsetEnd() {
        return offsetEnd;
    }

    public void setOffsetEnd(long offestEnd) {
        this.offsetEnd = offestEnd;
    }

    public byte getIsValid() {
        return isValid;
    }

    public void setIsValid(byte isValid) {
        this.isValid = isValid;
    }

    @Override
    public String toString() {
        return "Message{" +
                "basicProperties=" + basicProperties +
                ", body=" + Arrays.toString(body) +
                ", offsetBeg=" + offsetBeg +
                ", offsetEnd=" + offsetEnd +
                ", isValid=" + isValid +
                '}';
    }
}
